	.bank 0
	.org $C000

; ===================================
; ========== OHJELMA ALKAA ==========
; ===================================

	sei
	cld

; Kanttiaaltokanavat ja kohinakanava plle.
	lda #%00001011
	sta $4015

; ========== TITLE SCREEN ==========

TitleScreen:

	jsr SammutaPPU
	jsr TyhjennaSpriteMuisti
	jsr ValmistelePaletinKirjoitus

	ldx #00	; Lue 32 tavua ja kirjoita ne VRAM:iin.
LuePaletti1:
	lda TitlePaletti,x
	sta $2007
	inx
	cpx #32
	bne LuePaletti1

	jsr ValmisteleNameTablenKirjoitus

	ldx #00	; Luetaan kirjoitettavien tiilien numeroita (osa 1).
LueTitleTiilet1:
	lda TitleTiilet1,x
	sta $2007
	inx
	cpx #00	; Onko muuttuja pyrhtnyt ympri.
	bne LueTitleTiilet1
	ldx #00	; Luetaan kirjoitettavien tiilien numeroita (osa 2).
LueTitleTiilet2:
	lda TitleTiilet2,x
	sta $2007
	inx
	cpx #00
	bne LueTitleTiilet2
	ldx #00	; Luetaan kirjoitettavien tiilien numeroita (osa 3).
LueTitleTiilet3:
	lda TitleTiilet3,x
	sta $2007
	inx
	cpx #00
	bne LueTitleTiilet3
	ldx #00	; Luetaan kirjoitettavien tiilien numeroita (osa 4).
LueTitleTiilet4:
	lda TitleTiilet4,x
	sta $2007
	inx
	cpx #192	; Tm varasto on vain 192 tavua, koska 6 rivi tyttmtt.
	bne LueTitleTiilet4

	ldx #00	; Luetaan Attribute Tablet (96 tavua).
LueTitleAttr:
	lda TitleAttrTable,x
	sta $2007
	inx
	cpx #96
	bne LueTitleAttr

; Valikkospritet.
	lda #$95
	sta Sprite_valikko1
	sta Sprite_valikko2
	lda #$28
	ldx #01
	sta Sprite_valikko1,x
	sta Sprite_valikko2,x
	ldx #02			; Peilaus vasemmanpuoleisessa pois,
	lda #%00000000		; oikeanpuoleisessa pll.
	sta Sprite_valikko1,x
	lda #%01000000
	sta Sprite_valikko2,x
	ldx #03
	lda #80			; 10 merkki * 8 pix = 80
	sta Sprite_valikko1,x
	lda #176			; 22 merkki * 8 pix = 176
	sta Sprite_valikko2,x

	jsr SiirraSpritedata

	lda #%00010000	; Alusta PPU.
	sta $2000
	lda #%00011110
	sta $2001

; ========== TITLE SCREENIN VALIKKOTOIMINNOT ==========

	lda #01		; 1 = New Game, 2 = Help.
	sta MenuKursori
ValikkoLoop:
	jsr ReadJoypad

	lda Keystate	; onko startia painettu
	and #%00010000
	beq StartLoppu
	lda MenuKursori
	cmp #01		; onko "new game" valittu
	bne HelpValittu
	jmp PeliAlkaa
HelpValittu:
	jsr Viive
	jmp OhjeNaytto
StartLoppu:

	lda Keystate	; onko selecti painettu
	and #%00100000
	beq SelectLoppu
	lda MenuKursori
	cmp #02		; jos "Help" on valittu
	beq SelTakaisinEkaan
	inc MenuKursori	; ei olla viimeisess vaihtoehdossa, joten siirrytn alas
	jmp SelectValintaVaihdettu
SelTakaisinEkaan:
	lda #01
	sta MenuKursori
	jmp SelectValintaVaihdettu
SelectValintaVaihdettu:
	lda MenuKursori
	asl a
	asl a
	asl a
	asl a
	clc
	adc #$85
	sta Sprite_valikko1
	sta Sprite_valikko2

	jsr SiirraSpritedata
	jsr Viive
SelectLoppu:

	jmp ValikkoLoop

; ========== OHJENYTT ==========

OhjeNaytto:
	; Vripaletti on sama kuin Title Screeniss.

	jsr SammutaPPU
	jsr ValmistelePaletinKirjoitus

	ldx #00	; Lue 32 tavua ja kirjoita ne VRAM:iin.
HelpLuePaletti:
	lda OhjePaletti,x
	sta $2007
	inx
	cpx #32
	bne HelpLuePaletti

	jsr ValmisteleNameTablenKirjoitus

	ldx #00	; luetaan kirjoitettavien tiilien numeroita (osa 1)
LueHelpTiilet1:
	lda HelpTiilet1,x
	sta $2007
	inx
	cpx #00	; onko muuttuja pyrhtnyt ympri
	bne LueHelpTiilet1

	ldx #00	; luetaan kirjoitettavien tiilien numeroita (osa 2)
LueHelpTiilet2:
	lda HelpTiilet2,x
	sta $2007
	inx
	cpx #00	; onko muuttuja pyrhtnyt ympri
	bne LueHelpTiilet2

	ldx #00	; luetaan kirjoitettavien tiilien numeroita (osa 3)
LueHelpTiilet3:
	lda HelpTiilet3,x
	sta $2007
	inx
	cpx #00	; onko muuttuja pyrhtnyt ympri
	bne LueHelpTiilet3

	ldx #00	; luetaan kirjoitettavien tiilien numeroita (osa 4)
LueHelpTiilet4:
	lda HelpTiilet4,x
	sta $2007
	inx
	cpx #$C0	; tm varasto on vain 192 tavua, koska 6 rivi tyttmtt.
	bne LueHelpTiilet4

	ldx #00	; Attribute Tablet (96 tavua) 0:iksi.
	lda #00
LueHelpAttr:
	sta $2007
	inx
	cpx #96
	bne LueHelpAttr

	lda #%00010000	; alusta PPU
	sta $2000
	lda #%00001010	; spritet eivt ny
	sta $2001

HelpLoop:
	jsr ReadJoypad
	lda Keystate
	and #%00010000	; Onko startia painettu.
	beq HelpLoop	; Ei.
	jsr Viive		; On.
	jmp TitleScreen


; ========== PELI ALKAA ==========

PeliAlkaa:

	jsr SammutaPPU
	jsr TyhjennaSpriteMuisti

; Ammusspritet ovat aina taustagrafiikan takana.
; Spriten ominaisuustavu = perusosoite + 2.
	lda #%00100000
	ldx #06
AmmSprOminLoop:
	sta AmmustenSpritet,x
	inx
	inx
	inx
	inx
	cpx #70
	bne AmmSprOminLoop

; Tyhjenn muistipaikat (ei ammusten mr eik tulitusnopeutta).
	lda #00
	sta Keystate
	sta GunTimer
	sta Temp
	sta Random
	sta VihX1
	sta VihX2
	sta VihY1
	sta VihY2
	sta VihDmg
	ldx #01
	sta VihX1,x
	sta VihX2,x
	sta VihY1,x
	sta VihY2,x
	sta VihDmg,x
	sta AseenTeho
	sta FiringRate
	sta ScrollValue
	sta ScrollValueDelay
	sta AmmusLoopOsoitin
	sta AmmSprPerusOs
	sta VihollTuhottu
	sta BonusIlmassa
	sta BonusX
	sta VihKarttaLaskuri
; Nollataan ammusten tilan 16 muistipaikkaa sek vihollisten tilan ja vaakasuuntaliikkeen 6 muistipaikkaa.
	ldx #00
AmmusTilaTyhjLoop:
	sta AmmustenTilat,x
	inx
	cpx #16
	bne AmmusTilaTyhjLoop
	ldx #00
VihTilaTyhjLoop:
	sta VihIlmassa,x
	sta VihXSuunta,x
	inx
	cpx #06
	bne VihTilaTyhjLoop

; Asetetaan joitakin muuttujia.
	lda #01				; Aseen teho (1 - 4).
	sta AseenTeho
	ldx #00				; Maksimitulitusnopeus.
	lda AseenTehoToFiringrate,x
	sta FiringRate

	jsr ValmistelePaletinKirjoitus

	ldx #00	; lue 32 tavua ja kirjoita ne VRAM:iin
LuePaletti2:
	lda PeliPaletti,x
	sta $2007
	inx
	cpx #32
	bne LuePaletti2

	jsr ValmisteleNameTablenKirjoitus

	ldx #00	; luetaan kirjoitettavien tiilien numeroita (osa 1)
LuePeliTiilet1:
	lda PeliTiilet1,x
	sta $2007
	inx
	cpx #00	; onko muuttuja pyrhtnyt ympri
	bne LuePeliTiilet1
	ldx #00	; luetaan kirjoitettavien tiilien numeroita (osa 2)
LuePeliTiilet2:
	lda PeliTiilet2,x
	sta $2007
	inx
	cpx #00
	bne LuePeliTiilet2
	ldx #00	; luetaan kirjoitettavien tiilien numeroita (osa 3)
LuePeliTiilet3:
	lda PeliTiilet3,x
	sta $2007
	inx
	cpx #00
	bne LuePeliTiilet3
	ldx #00	; luetaan kirjoitettavien tiilien numeroita (osa 4)
LuePeliTiilet4:
	lda PeliTiilet4,x
	sta $2007
	inx
	cpx #192	; tm varasto on vain 192 tavua, koska 6 rivi tyttmtt.
	bne LuePeliTiilet4

	ldx #00	; Name Tablet kirjoitettu, mutta viel Attribute Tablet (96 tavua) 0:iksi.
	lda #00
LuePeliAttr:
	sta $2007
	inx
	cpx #96
	bne LuePeliAttr

; Oman lentokoneen spritedata.
	lda #$C8		; Y-koordinaatti (spriten perusosoite)
	sta Sprite_omakone1
	lda #$D0
	sta Sprite_omakone2
	sta Sprite_omakone3
	sta Sprite_omakone4
	lda #$D8
	sta Sprite_omakone5
	sta Sprite_omakone6
	sta Sprite_omakone7
	lda #$E0
	sta Sprite_liekki

	ldx #01		; tiilten numerot (perusosoite + 1)
	lda #04
	sta Sprite_omakone1,x
	lda #05
	sta Sprite_omakone3,x
	lda #06
	sta Sprite_omakone6,x
	lda #07
	sta Sprite_omakone2,x
	sta Sprite_omakone4,x
	lda #08
	sta Sprite_omakone5,x
	sta Sprite_omakone7,x
	lda #$3E
	sta Sprite_liekki,x

	ldx #02		; kytettv paletti ja muuta tietoa (perusosoite + 2)
	lda #%00100000	; ei peilausta, paletti 1/4
	sta Sprite_omakone1,x
	sta Sprite_omakone2,x
	sta Sprite_omakone3,x
	sta Sprite_omakone5,x
	sta Sprite_omakone6,x
	lda #%01100000	; peilaus, paletti 1/4
	sta Sprite_omakone4,x
	sta Sprite_omakone7,x
	lda #%00100010	; ei peilausta, paletti 3/4
	sta Sprite_liekki,x

	ldx #03		; X-koordinaatit (perusosoite + 3). Kone on vaakasuunnassa keskell ruutua.
	lda #$74
	sta Sprite_omakone2,x
	sta Sprite_omakone5,x
	lda #$7C
	sta Sprite_omakone1,x
	sta Sprite_omakone3,x
	sta Sprite_omakone6,x
	sta Sprite_liekki,x
	lda #$84
	sta Sprite_omakone4,x
	sta Sprite_omakone7,x

; Ammusnytn spritedata.
	lda #$D0		; Y-koordinaatti (spriten perusosoite)
	sta Sprite_asevoima
	jsr PaivitaAsevoimaNaytto
	ldx #02		; paletti ja muuta tietoa (perusosoite + 2)
	lda #%00000000
	sta Sprite_asevoima,x
	ldx #03		; X-koordinaatti (perusosoite + 3)
	lda #$F0
	sta Sprite_asevoima,x

	jsr SiirraSpritedata

	lda #%10010000	; PPU plle. "Execute NMI on VBlank" on pll.
	sta $2000
	lda #%00011110
	sta $2001

PeliLoop:
	jmp PeliLoop